<?php
/**
 * Model générique
 * 
 * @package bp-clients
 */
 
/**
 * Model générique
 * 
 * fournit les méthodes de bases d'un model
 * 
 * @package bp-clients
 */
abstract class Application_Model_ModelAbstract{
	/**
	 * les attributs utilisables par le mapper
	 * @var array
	 */
	protected $_nomsAttributs;
    
    /**
     * Le mapper de cet objet
     * @var Application_Model_MapperAbstract
     */
    protected $_mapper;
	
	/**
	 * Constructeur
     * @param Application_Model_MapperAbstract $mapper le mapper de cet objet
	 * @param array $nomsAttributs tableau de noms des attributs utilisables par le mapper
	 * @param array $attributs tableau de valeurs des attributs
	 */
    public function __construct(Application_Model_MapperAbstract $mapper,
                                array $nomsAttributs, 
                                array $attributs = null)
    {
        $this->_mapper = $mapper;
    	$this->_nomsAttributs = $nomsAttributs;        
        if (is_array($attributs)) {
            $this->setAttributs($attributs);
        }   
    }

	/**
	 * Renvoie les noms des attributs
	 * @return array
	 */
	public function getNomAttributs()
	{
		return $this->_nomsAttributs;
	}
	
    /**
	 * Assigne les attributs
	 * @param array $attributs les tableau [nom=>valeur] des attributs
	 * @return Application_Model_ModelAbstract l'object model
	 */
    public function setAttributs(array $attributs)
    {
        $methodes = get_class_methods($this);
        foreach ($attributs as $nom => $valeur) {
            $methode = 'set' . ucfirst($nom);
            if (in_array($methode, $methodes)) {
                $this->$methode($valeur);
            }
        }
		return $this;  
    }
	    
    /**
	 * Renvoie le tableau [nom=>valeur] d'attributs
	 * @return array
	 */
    public function toArray()
    {
        $retour = array();	
        foreach ($this->_nomsAttributs as $nomAttribut) {
            $methode = 'get' . ucfirst($nomAttribut);
            $retour[$nomAttribut] = $this->$methode();
        }
		return $retour;
    }
    
    /**
     * Sauvegarde ce model dans la base
     * 
     * Appelle la fonction save du mapper
     * @return int l'identifiant du model
     */
    public function save()
    {
        return $this->_mapper->save($this);
    }
}
